package com.bestcem.xm.award.controller.dto;

import com.bestcem.xm.award.enums.AwardIssueTypeEnum;
import com.bestcem.xm.award.enums.AwardLevelEnum;
import com.bestcem.xm.award.enums.AwardStatusEnum;
import com.bestcem.xm.award.enums.AwardTypeEnum;
import com.bestcem.xm.award.service.dto.FileInfoDTO;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * 奖励传输DTO controller层使用
 * @author sh.pei <sh.pei@idiaoyan.com>
 * @version v3.0
 * @date 2021/8/18 9:31
 */
@ToString
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
public class AwardDTO implements Serializable {

    /**
     * Required. 名称,长度30以内
     */
    private String name;

    /**
     * Required. 项目id
     */
    @JsonProperty(value = "org_id")
    private String orgId;

    /**
     * 项目id
     */
    @JsonProperty(value = "project_id")
    private String projectId;

    /**
     * Required. 奖励规则
     */
    private AwardRuleDTO rule;

    /**
     * Required. 奖励类型 {@link AwardTypeEnum}
     */
    private Integer type;

    /**
     * Optional. 奖励id，修改时必传
     */
    private String id;

    /**
     * Optional. 活动id
     */
    @JsonProperty(value = "activity_id")
    private String activityId;

    /**
     * Optional. 当前个数
     */
    @JsonProperty(value = "current_count")
    private Integer currentCount;

    /**
     * 如果是true，表示已经激活。如果是false，表示未激活。
     * Default is false.
     */
    private Boolean activated;

    /**
     * Optional. 奖励状态 {@link AwardStatusEnum}
     */
    private Integer status;

    /**
     * Optional. 清算标志
     */
    @JsonProperty(value = "settlement_status")
    private Integer settlementStatus;

    /**
     * Optional. 数据行时间标识
     */
    @JsonProperty(value = "base_time")
    private BaseTimeDTO baseTime;

    /**
     * Optional. 基本配置
     */
    private AwardBasicDTO basic;

    /**
     * Optional. 抽奖发放方式
     */
    private AwardIssueDTO issue;

    /**
     * Optional. 优惠券页面配置
     */
    private AwardPageDTO page;

    /**
     * Optional. 抽奖奖项
     */
    @JsonProperty(value = "draw_awards")
    private List<DrawAwardDTO> drawAwards;

    /**
     * 增加抽奖奖项
     * @param drawAward
     */
    public void addDrawAward(DrawAwardDTO drawAward) {
        if (drawAwards == null) {
            drawAwards = new ArrayList<>();
        }
        drawAwards.add(drawAward);
    }

    /**
     * 奖励规则DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardRuleDTO implements Serializable{

        /**
         * Optional. 单人中奖次数限制 单微信号领取次数限制
         */
        private Integer win;

        /**
         * Optional. 单人抽奖次数限制
         */
        private Integer draw;

        /**
         * Optional. 账户访问限制
         */
        private Integer account;

        /**
         * Optional. 设备访问次数限制
         */
        private Integer device;

        /**
         * Optional. ip访问次数限制
         */
        private Integer ip;

        /**
         * Optional. 答题时间限制
         */
        private Integer time;

        /**
         * Optional. 单日领取次数限制
         */
        private Integer day;

        /**
         * Optional. 设置的问卷分值
         */
        private Integer score;

        /**
         * 如果是true，奖励完成后停止投放。如果是false，奖励完成后不结束投放。
         * Default is false.
         */
        @JsonProperty(value = "stop_deliver")
        private Boolean stopDeliver;

        /**
         * 有效期内达到抽奖次数提前结束奖励
         */
        @JsonProperty(value = "stop_award")
        private Boolean stopAward;
    }

    /**
     * 奖励基本属性DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardBasicDTO implements Serializable{

        /**
         * Required.  奖励结束时间
         */
        @JsonProperty(value = "end_time")
        private String endTime;

        /**
         * Optional. 红包显示公司名称,长度10以内
         */
        @JsonProperty(value = "display_name")
        private String displayName;

        /**
         * Optional. 红包显示公司logo
         */
        @JsonProperty(value = "display_logo")
        private FileInfoDTO displayLogo;

        /**
         * Optional. 红包奖励必传,红包详情, 会显示在领取红包的入账通知和详情页，比如：问卷红包，长度10以内
         */
        private String name;

        /**
         * Optional. 红包奖励必传. 0: 百分百获得红包; N(>1): 概率红包,预计总参与人数;
         */
        private Integer probability;

        /**
         * Optional. 单个红包金额, 单位分, 普通红包必选
         */
        @JsonProperty(value = "single_amount")
        private Integer singleAmount;

        /**
         * Optional. 总金额, 单位分, 拼手气红包必选
         */
        @JsonProperty(value = "total_amount")
        private Integer totalAmount;

        /**
         * Optional. 所有人抽奖次数限制 红包个数
         */
        @JsonProperty(value = "total_count")
        private Integer totalCount;

        /**
         * Optional. 奖励开始时间
         */
        @JsonProperty(value = "start_time")
        private String startTime;
    }

    /**
     * 抽奖奖项DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static class DrawAwardDTO implements Serializable{

        /**
         * Required. 奖项名称,列表内唯一
         */
        private String name;

        /**
         * Required. 中奖概率
         */
        private String probability;

        /**
         * Required. 奖项数量
         */
        private Integer num;

        /**
         * Required. 奖项等级 {@link AwardLevelEnum}
         */
        private Integer level;

        /**
         * Optional. 奖项简介
         */
        private String desc;

        /**
         * Optional. 奖项图片
         */
        @JsonProperty(value = "img_url")
        private String imgUrl;

        /**
         * 奖项发放方式
         */
        private Integer method;

        /**
         * 奖项兑奖码前缀
         */
        private String prefix;

        /**
         * 领奖提示
         */
        private String tip;

        /**
         * 奖项等级描述
         */
        @JsonProperty(value = "level_str")
        private String levelStr;
    }

    /**
     * 奖励发放方式DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardIssueDTO implements Serializable{

        /**
         *  Required. 奖励发放方式 {@link AwardIssueTypeEnum}
         */
        private Integer type;

        /**
         * Required. 兑奖操作提示
         */
        private String tip;

        /**
         * Optional. 兑奖码前缀
         */
        private String prefix;

        /**
         * Optional. 短信通知内容
         */
        @JsonProperty(value = "sms_content")
        private String smsContent;

        /**
         * Optional. 短信模板id
         */
        @JsonProperty(value = "template_id")
        private String templateId;

        /**
         * Optional. 短信模板名称
         */
        @JsonProperty(value = "template_title")
        private String templateTitle;
    }

    /**
     * 奖励页面配置DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static class AwardPageDTO implements Serializable{

        /**
         * Optional. 第三方奖励和定制建立必传,跳转链接url配置
         */
        private String url;

        /**
         *  Optional. css自定义代码路径id
         */
        @JsonProperty(value = "css_id")
        private String cssId;

        /**
         * Optional. css自定义代码
         */
        @JsonProperty(value = "css_script")
        private String cssScript;

        /**
         * Optional. css自定义代码路径
         */
        @JsonProperty(value = "css_file_path")
        private String cssFilePath;

        /**
         *  Optional. 奖励页自定义代码路径id
         */
        @JsonProperty(value = "template_id")
        private String templateId;

        /**
         *  Optional. 奖励页自定义代码路径id
         */
        @JsonProperty(value = "template_script")
        private String templateScript;

        /**
         *  Optional. 奖励页自定义代码路径id
         */
        @JsonProperty(value = "template_file_path")
        private String templateFilePath;

        /**
         * Optional. 附件
         */
        @JsonProperty(value = "file_infos")
        private List<FileInfoDTO> fileInfos;

        /**
         *  Optional. 微信优惠券和支付宝优惠券必传, 手机端页面配置
         */
        private AwardFrontDTO phone;

        /**
         * Optional. 微信优惠券和支付宝优惠券必传, 电脑端页面配置
         */
        private AwardFrontDTO pc;

        public void addFileInfo(FileInfoDTO fileInfoDTO) {
            if (fileInfos == null) {
                fileInfos = new ArrayList<>();
            }
            fileInfos.add(fileInfoDTO);
        }
    }

    /**
     * 奖励前端配置DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardFrontDTO implements Serializable{

        /**
         *  Required. 奖励前端配置背景
         */
        private AwardFrontBgDTO background;

        /**
         * Required. 奖励前端配置二维码
         */
        @JsonProperty(value = "qr_code")
        private AwardFrontQrDTO qrCode;

        /**
         * 中奖标题
         */
        private String title;

        /**
         * Required. 奖励前端配置文本
         */
        private AwardFrontTxtDTO text;

        /**
         * Optional. logo配置
         */
        private AwardFrontLogoDTO logo;
    }

    /**
     * 奖励前端配置背景DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardFrontBgDTO implements Serializable{

        /**
         * Optional. 图片id,color与id+path只能二选一，有color就不存储id+path
         */
        private String id;

        /**
         * Optional. 图片路径,color与id+path只能二选一，有color就不存储id+path
         */
        private String path;

        /**
         * Optional. 背景颜色，color与id+path只能二选一，有color就不存储id+path
         */
        private String color;
    }

    /**
     * 奖励前端配置二维码DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardFrontQrDTO implements Serializable{

        /**
         * Required. 图片id
         */
        private String id;

        /**
         * Required. 图片路径
         */
        private String path;
    }

    /**
     * 奖励前端配置二维码DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardFrontTxtDTO implements Serializable{

        /**
         *  Required. 文字颜色
         */
        private String color;

        /**
         * Required. 文本内容
         */
        private String content;

        /**
         * Required. 文字大小
         */
        private Integer size;

        /**
         * 如果是true，字体加粗。如果是false，字体不加粗。
         * Default is false.
         */
        private Boolean bold;

        /**
         *  如果是true，字体倾斜。如果是false，字体不倾斜。
         *  Default is false.
         */
        private Boolean italic;

        /**
         * 如果是true，字体添加下划线。如果是false，字体不添加下划线。
         * Default is false.
         */
        private Boolean underline;
    }

    /**
     * logo配置DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class AwardFrontLogoDTO implements Serializable{

        /**
         * Required. 图片id
         */
        private String id;

        /**
         * Required. 图片路径
         */
        private String path;

        /**
         * Required. 图片位置
         */
        private Integer pos;

        /**
         * Required. 缩放比例
         */
        private Integer scale;
    }


    /**
     * 通用时间信息DTO
     * @author sh.pei <sh.pei@idiaoyan.com>
     * @version v3.0
     * @date 2021/8/18 9:31
     */
    @ToString
    @NoArgsConstructor
    @AllArgsConstructor
    @Getter
    @Setter
    public static final class BaseTimeDTO implements Serializable{

        /**
         * 创建时间
         */
        @JsonProperty(value = "create_time")
        private String createTime;

        /**
         * 更新时间
         */
        @JsonProperty(value = "update_time")
        private String updateTime;
    }

}
